home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / SYSUTIL2.I < prev    next >
Encoding:
Modula Implementation  |  1992-02-14  |  5.1 KB  |  186 lines

  1. IMPLEMENTATION MODULE SysUtil2;
  2.  
  3. (*
  4.   27.11.90  TT  Set/LongJump retten/restaurieren auch SSP
  5.   01.05.90  TT  Set/LongJump restaurieren A7 korrekt (war bisher 4 zu niedrig)
  6.   07.12.88  TT  Grunderstellung
  7. *)
  8.  
  9. (*$L-  global *)
  10. (*$Y+,N+*)
  11.  
  12. FROM SYSTEM IMPORT ASSEMBLER, WORD, LONGWORD, ADDRESS;
  13.  
  14. (*
  15. TYPE JumpBuf = RECORD
  16.                  pc: ADDRESS;
  17.                  ssp: LONGWORD;
  18.                  usp: LONGWORD;
  19.                  sr: WORD;
  20.                  d: ARRAY [1..7] OF LONGWORD;
  21.                  a: ARRAY [1..6] OF LONGWORD;
  22.                END;
  23. *)
  24.  
  25. PROCEDURE SetJump ( VAR hdl: JumpBuf ): INTEGER;
  26.   BEGIN
  27.     ASSEMBLER
  28.         MOVEQ   #1,D0
  29.         MOVE.L  D0,-(A7)        ; Super (1)
  30.         MOVE    #$20,-(A7)
  31.         TRAP    #1
  32.         TST     D0
  33.         BNE     alreadySuper
  34.         ; wir sind im User-Mode
  35.         MOVE.W  D0,4(A7)        ; Super (0)
  36.         TRAP    #1
  37.         ADDQ.L  #6,A7
  38.         MOVE.L  -(A3),A0
  39.         MOVE.L  (A7),(A0)+      ; PC
  40.         MOVE.L  D0,(A0)+        ; SSP
  41.         MOVE.L  A7,(A0)+        ; USP
  42.         MOVE    SR,(A0)
  43.         ANDI    #$CFFF,(A0)+    ; SR
  44.         MOVEM.L D1-D7/A1-A6,(A0)
  45.         CLR     (A3)+
  46.         MOVE.L  A7,USP
  47.         MOVE.L  D0,A7           ; SSP wiederherstellen
  48.         ANDI    #$CFFF,SR
  49.         RTS
  50.       alreadySuper:
  51.         ADDQ.L  #6,A7
  52.         MOVE.L  -(A3),A0
  53.         MOVE.L  (A7),(A0)+      ; PC
  54.         MOVE.L  A7,(A0)+        ; SSP
  55.         MOVE.L  USP,A0
  56.         MOVE.L  A0,(A0)+        ; USP
  57.         MOVE    SR,(A0)+        ; SR
  58.         MOVEM.L D1-D7/A1-A6,(A0)
  59.         CLR     (A3)+
  60.     END
  61.   END SetJump;
  62.  
  63. PROCEDURE LongJump ( VAR hdl: JumpBuf; rtnCode: INTEGER );
  64.   BEGIN
  65.     ASSEMBLER
  66.         MOVEQ   #1,D0
  67.         MOVE.L  D0,-(A7)        ; Super (1)
  68.         MOVE    #$20,-(A7)
  69.         TRAP    #1
  70.         TST     D0
  71.         BNE     alreadySuper
  72.         ; wir sind im User-Mode
  73.         MOVE.W  D0,4(A7)        ; Super (0)
  74.         TRAP    #1
  75.         MOVE.L  D0,A7           ; SSP wiederherstellen
  76.       alreadySuper:
  77.         MOVE.W  -(A3),D0
  78.         MOVE.L  -(A3),A2
  79.         MOVE.L  (A2)+,A0        ; PC
  80.         MOVE.L  (A2)+,A7        ; SSP
  81.         MOVE.L  (A2)+,A1        ; USP
  82.         MOVE.L  A1,USP
  83.         MOVE    (A2)+,SR        ; SR
  84.         MOVEM.L (A2),D1-D7/A1-A6
  85.         MOVE    D0,(A3)+
  86.         MOVE.L  A0,(A7)
  87.     END
  88.   END LongJump;
  89.  
  90. (*
  91. TYPE ModeBuf = RECORD
  92.                  sr: WORD;
  93.                  a7: ADDRESS;
  94.                END;
  95. *)
  96.  
  97. PROCEDURE InSupervisorMode (): BOOLEAN;
  98.   BEGIN
  99.     ASSEMBLER
  100.         MOVEQ   #1,D0
  101.         MOVE.L  D0,-(A7)        ; Super (1)
  102.         MOVE    #$20,-(A7)
  103.         TRAP    #1
  104.         ADDQ.L  #6,A7
  105.         ANDI    #1,D0
  106.         MOVE    D0,(A3)+
  107.     END
  108.   END InSupervisorMode;
  109.  
  110. PROCEDURE EnterSupervisorMode ( VAR hdl: ModeBuf );
  111.   BEGIN
  112.     ASSEMBLER
  113.         MOVEQ   #1,D0
  114.         MOVE.L  D0,-(A7)        ; Super (1)
  115.         MOVE    #$20,-(A7)
  116.         TRAP    #1
  117.         TST.L   D0
  118.         BNE     alreadySuper
  119.         ; wir waren im User-Mode
  120.         MOVE.W  D0,4(A7)        ; Super (0)
  121.         TRAP    #1
  122.         ADDQ.L  #6,A7
  123.         
  124.         MOVE.L  -(A3),A2
  125.         MOVE.L  D0,(A2)
  126.         RTS
  127.  
  128.   alreadySuper:
  129.         ADDQ.L  #6,A7
  130.         MOVE.L  -(A3),A2
  131.         CLR.L   (A2)
  132.     END
  133.   END EnterSupervisorMode;
  134.  
  135. PROCEDURE LeaveSupervisorMode ( VAR Hdl: ModeBuf );
  136.   BEGIN
  137.     ASSEMBLER
  138.         MOVE.L  -(A3),A0
  139.         MOVE.L  (A0),D0
  140.         BEQ     nix
  141.         MOVE.L  A7,USP          ; zuerst USP restaurieren
  142.         MOVE.L  D0,A7           ; dann SSP restaurieren
  143.         ANDI    #$CFFF,SR       ; zuletzt zurück in Usermode
  144.       nix
  145.     END
  146.   END LeaveSupervisorMode;
  147.  
  148. PROCEDURE SetIRMask ( level: IRLevel );
  149.   BEGIN
  150.     ASSEMBLER
  151.         SUBQ.L  #4,A7
  152.         MOVE.L  A7,(A3)+
  153.         JSR     EnterSupervisorMode
  154.         MOVE    SR,D2
  155.         MOVE.W  -(A3),D0
  156.         ANDI    #7,D0
  157.         LSL.W   #8,D0
  158.         ANDI    #$F8FF,D2
  159.         OR      D0,D2
  160.         MOVE    D2,SR
  161.         MOVE.L  A7,(A3)+
  162.         JSR     LeaveSupervisorMode
  163.         ADDQ.L  #4,A7
  164.     END
  165.   END SetIRMask;
  166.  
  167. PROCEDURE IRMask (): IRLevel;
  168.   BEGIN
  169.     ASSEMBLER
  170.         SUBQ.L  #4,A7
  171.         MOVE.L  A7,(A3)+
  172.         JSR     EnterSupervisorMode
  173.         MOVE    SR,D0
  174.         LSR.W   #8,D0
  175.         ANDI    #7,D0
  176.         MOVE    D0,(A3)+
  177.         MOVE.L  A7,(A3)+
  178.         JSR     LeaveSupervisorMode
  179.         ADDQ.L  #4,A7
  180.     END
  181.   END IRMask;
  182.  
  183. END SysUtil2.
  184. ə
  185. (* $FFEAA8A7$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$000011CB$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353F$FFF0353FÇ$00000060T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000000EE$00000BD7$00000C0A$000001DC$000001A0$00000163$000001AC$00000127$00000226$000001A0$000000B4$0000002E$00000060$000000E6$FFEAA8A7$FFEAA8A7îÇÇ*)
  186.